package unrn.isiii.bean;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import unrn.isiii.dao.ProductoDao;
import unrn.isiii.dao.TaskDao;
import unrn.isiii.model.Producto;
import unrn.isiii.model.Task;

@Component("productoController")
public class ProductoController {

	private static final Logger logger = LoggerFactory
			.getLogger(ProductoController.class);

	private Producto producto = new Producto();
	private List<Producto> productos;

	@Autowired
	private ProductoDao productoDao;

	public String getMessage() {
		logger.debug("Returning message from task home bean");
		return "Hello from Spring";
	}

	public Producto getProducto() {
		return producto;
	}

	public ProductoDao getProductoDao() {
		return productoDao;
	}

	public void setProductoDao(ProductoDao productoDao) {
		this.productoDao = productoDao;
	}

	public void setProducto(Producto producto) {
		this.producto = producto;
	}

	public void setProductos(List<Producto> productos) {
		this.productos = productos;
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void saveProducto() {
		if (producto.getId() == null)
			productoDao.create(producto);
		else
			productoDao.update(producto);
		producto = new Producto();
		FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Alta",
				"realizada con exito.");
		if (FacesContext.getCurrentInstance() != null)
			FacesContext.getCurrentInstance().addMessage(null, msg);
		invalidateProductos();
		producto = new Producto();
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void eliminar(Long id) {
		productoDao.delete(id);
		FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Alta",
				"realizada con exito.");
		if (FacesContext.getCurrentInstance() != null)
			FacesContext.getCurrentInstance().addMessage(null, msg);
		invalidateProductos();
	}

	private void invalidateProductos() {
		productos = null;
	}

	public List<Producto> getProductos() {
		if (productos == null) {
			productos = productoDao.findAll();
		}
		return productos;
	}

	public void seleccionarProducto(Producto producto) {
		setProducto(producto);
	}

	public void onEdit(RowEditEvent event) {
		FacesMessage msg = new FacesMessage("Producto Edited",
				((Producto) event.getObject()).getModel());

		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void onCancel(RowEditEvent event) {
		FacesMessage msg = new FacesMessage("Producto Cancelled",
				((Producto) event.getObject()).getModel());

		FacesContext.getCurrentInstance().addMessage(null, msg);
	}
}
